import os
from dataclasses import dataclass
from transformers import AutoConfig


@dataclass
class Config:
    model: str
    max_num_batched_tokens: int = 16384 # 单个批处理中允许的最大 token 数量,控制批处理的总大小，防止内存溢出
    max_num_seqs: int = 512 # 单个批处理中允许的最大序列（请求）数量
    max_model_len: int = 4096 # 模型支持的最大上下文长度
    gpu_memory_utilization: float = 0.9
    tensor_parallel_size: int = 1
    enforce_eager: bool = False # 控制是否跳过PyTorch的图编译优化 True: 调试模式，便于调试但性能较低 False: 生产模式，启用优化但可能遇到编译错误
    hf_config: AutoConfig | None = None # HuggingFace 模型配置对象 获取模型的架构细节（层数、隐藏维度等）
    eos: int = -1 #  -1 表示使用模型配置中的默认EOS
    kvcache_block_size: int = 256
    num_kvcache_blocks: int = -1

    def __post_init__(self):
        assert os.path.isdir(self.model)
        assert self.kvcache_block_size % 256 == 0
        assert 1 <= self.tensor_parallel_size <= 8
        self.hf_config = AutoConfig.from_pretrained(self.model)
        self.max_model_len = min(self.max_model_len, self.hf_config.max_position_embeddings)
        assert self.max_num_batched_tokens >= self.max_model_len
